package com.lct.d3_ploymorphism;


public class Test {
	public static void main(String[] args) {
		//多态下右边对象是解耦合的
		Animal a = new Cat();
		a.cry();

		Cat c = new Cat();
		go(c);

		Dog d = new Dog();
		go(d);

		System.out.println("----------------------------");

		//多态下存在的一个问题，不能直接调用子类独有的功能
//		a.catchFish();

		//强制转换解决此问题
		Cat c1 = (Cat) a;
		c1.catchFish();

		//只有继承或者实现关系的两个类才可以强制转换

//		Dog d1 = (Dog) a; //编译不报错，运行报错




	}

	//多态下，父类类型作为方法的形参，可以接受一切子类对象，方法更便捷
	public  static void go(Animal a){
		System.out.println("开始...");
		a.cry();
		//因此java的强制类型转换前要先判断对象的真是类型，在进行强制转换
		if(a instanceof Dog){
			Dog d2 = (Dog) a;
			d2.lookDoor();
		} else if (a instanceof Cat) {
			Cat c2 = (Cat) a;
			c2.catchFish();
		}
		System.out.println("结束...");
	}


}
